package com.jt.www.biz.order_pc.service;

import com.github.pagehelper.PageInfo;
import com.jt.www.domain.qo.EndorsQueryParam;
import com.jt.www.domain.qo.EndorsQueryResp;
import com.jt.www.domain.qo.EndorsementsEduQueryVO;
import com.jt.www.domain.vo.EduPolicyVO;
import com.jt.www.model.param.endorse.EndorseListParam;
import com.jt.www.model.param.endorse.EndorseParam;
import com.jt.www.model.param.endorse.SaveEndorseParam;
import com.jt.www.model.vo.endorse.CheckNumVO;
import com.jt.www.model.vo.endorse.EndorseResponseVo;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.web.multipart.MultipartFile;
import org.thymeleaf.context.WebContext;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

public interface EndorseService {

    /**
     * 上传批单excel并进行人员校验
     *
     * @return 错误信息
     */
    EndorseResponseVo uploadEndorse(EndorseParam param, MultipartFile excelFile);

    /**
     * 批单类型：人员替换，上传批单excel并进行人员校验
     *
     * @param replaceExcelFile 新的清单
     * @param policyType       险种类型
     * @param insuranceId      投保单号
     * @param originFileId     被替换excel的fileId
     */
    EndorseResponseVo checkReplaceEndorse(String insuranceId, Integer policyType,
                                          MultipartFile replaceExcelFile, String originFileId);

    /**
     * 批单类型：人员替换，上传批单excel并进行人员校验
     *
     * @param originExcelFile 被替换的清单
     * @param policyType      险种类型
     * @param insuranceId     投保单号
     */
    EndorseResponseVo checkOriginEndorse(String insuranceId, Integer policyType,
                                         MultipartFile originExcelFile);

    /**
     * 批单类型：人员替换，上传批单excel并进行人员校验  v2
     *
     * @param replaceExcelFile 新的清单
     * @param policyType       险种类型
     * @param insuranceId      投保单号
     * @param originFileId     被替换excel的fileId
     */
    EndorseResponseVo checkReplaceEndorseV2(String userCode, String insuranceId, Integer policyType,
                                            MultipartFile replaceExcelFile, String originFileId);

    /**
     * 批单类型：人员替换，上传批单excel并进行人员校验 v2
     *
     * @param originExcelFile 被替换的清单
     * @param policyType      险种类型
     * @param insuranceId     投保单号
     */
    EndorseResponseVo checkOriginEndorseV2(String userCode, String insuranceId, Integer policyType,
                                           MultipartFile originExcelFile);

    /**
     * 保存批单消息
     */
    int saveEndorse(SaveEndorseParam param);

    /**
     * 保存投保单信息
     */
    int saveInsurance(List<String> appCode, String usercode, Boolean policyTypeFlag, Boolean exceptionFlag);

    /**
     * 定时保存生效批单
     */
    void endorseEffect();

    /**
     * 批单出单处理
     */
    void endorseEffect(String findCode, List<SaveEndorseParam> entities);

    /**
     * 批单出单处理
     * 为支持同一个service 提出来
     */
    void endorseEffect(String findCode, SaveEndorseParam param);

    /**
     * 定时保存生效投保单
     */
    void insuranceEffect();

    /**
     * 投保单出单处理
     *
     * @param entities
     */
    void insuranceEffect(String findCode, List<SaveEndorseParam> entities);

    /**
     * 投保单出单处理
     * 为支持同一个service 提出来
     *
     * @param param
     */
    void insuranceEffect(String findCode, SaveEndorseParam param);

    /**
     * 3天后，1年内出单的 批单/投保单 出单处理
     * 定时处理3天内未出单的  投保单及批单
     * 正常是查询3天未出单的投保单及批单，这个定时任务是处理1年内没处理的保证
     * 出单出问题3天内未成功出单的但是之后出单的投保单或批单正常处理
     */
    void insuranceEndorseEffect();

    /**
     * 线下出单，保存参数
     */
    int saveEndorseParam(SaveEndorseParam param);

    /**
     * 线下出单，保存参数
     */
    int saveInsuranceParam(List<String> appCode, String usercode, String findCode);

    /**
     * 使最终表投保单扫描参数生效
     *
     * @param appCode 投保单号
     */
    int effectiveInsParam(String appCode);

    /**
     * 使最终表批单扫描参数生效
     *
     * @param endorOrderCode 批单订单号
     */
    int effectiveEndParam(String endorOrderCode);

    /**
     * 替换和被替换具体人员信息
     *
     * @param replaceFileId 替换清单文件id
     * @param originFileId  被替换清单文件id
     * @param policyType    险种类型
     */
    Map replaceDetail(String replaceFileId, String originFileId, Integer policyType);

    /**
     * 计算批单需要付款/退款的人数
     *
     * @return
     */
    List<CheckNumVO> checkPayPersonNum(List<CheckNumVO> vo) throws Exception;

    /**
     * 出单后补录清单
     *
     * @param appCode  投保单号
     * @param usercode 用户编号
     * @param fileIds  文件id列表
     */
    int addFiles(String appCode, String usercode, List<String> fileIds);

    /**
     * 案件关联清单人员列表
     *
     * @param param
     * @return
     */
    PageInfo getEndorseList(EndorseListParam param);

    /**
     * 案件关联保单时解析清单人员
     *
     * @param insuranceId
     */
    ResponseEntity analysisEndorse(String insuranceId);

    /**
     * 查询保单中心批单列表
     *
     * @param endorsementsEduQueryVO
     * @return
     */
    List<EduPolicyVO> queryProEndorseList(EndorsementsEduQueryVO endorsementsEduQueryVO);

    /**
     * 查询保单中心批单确认列表
     *
     * @param endorsQueryParam
     * @return
     */
    List<EndorsQueryResp> endorsementConformList(EndorsQueryParam endorsQueryParam);

    void downEndorPdf(WebContext ctx, String flag, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception;

    /**
     * 通过批单申请删除批单
     *
     * @param applyId
     * @return
     */
    int deleteByApplyId(String applyId);

    /**
     * 替换人员清单
     */
    boolean updateAppEndorseByFileId(String findCode, String appCode, String fileId, String userCode) throws Exception;
}
